# 一边循环一边计算的机制 成为生成器

"""
得到生成器的方式
1. 通过列表推导式得到生成器
    使用小括号得到生成器
2. 定义生成器的方式二：借助函数 + yield完成
    只要函数中出现了yield关键字，说明函数就不是函数了，变成生成器了
  步骤：
    1. 定义一个函数，函数中使用yield关键字
    2. 调用函数，接收调用的结果
    3. 得到的结果就是生成器
    4. 借助于__next__ 或者next()得到元素

应用点：协程

"""

new_list = [i * 3 for i in range(10)]
print(new_list)
# 使用小括号得到生成器
g = (i * 3 for i in range(20))
print(type(g))


# 方式1
# print(g.__next__())
# print("*" * 200)
# for item in g.__iter__():
#     print(item)

# 方式2
# print(next(g))
# print(next(g))
# print(next(g))
# print(next(g))

# while True:
#     try:
#         print(next(g))
#     except Exception as err:
#         print("打印结束", err)
#         break

# def func():
#     n = 0
#     while True:
#         n += 1
#         yield n
#
#
# g = func()
# print(type(g))
# while True:
#     try:
#         res = next(g)
#         print(res)
#         if res == 200:
#             break
#     except Exception as err:
#         print("进入到这里来了")
#         break
# 斐波那契数列

def f01(length):
    a, b = 0, 1
    n = 0

    while n <= length:
        if n == 0:
            yield a
            n += 1
            continue
        if n == 1:
            yield b
            n += 1
            continue

        a, b = b, a + b
        yield b
        n += 1


g1 = f01(10)
while True:
    try:
        res = next(g1)
        print(res)
    except Exception as err:
        print("进入到这里来了")
        break
